package com.xygz.orm;

import com.xygz.orm.enums.SQLKeywords;
import com.xygz.orm.internal.query.Condition;
import com.xygz.orm.internal.query.Ops;

/**
 * 条件构建器
 *
 * @author xiyuan-lgz 2023-12-03 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public interface ConditionBuilder {
    
    /**
     * 创建条件
     *
     * @param eClass 条件所属表
     * @param isOr   是否为 Or 条件
     * @param column 表字段
     * @param kwd    条件关键字
     * @param val    条件值
     * @param <E>    表类型
     * @return 条件对象
     * @throws IllegalArgumentException 异常信息
     */
    public <E> Condition create(Class<E> eClass, boolean isOr, String column, SQLKeywords kwd, Object val) throws IllegalArgumentException;
    
    /**
     * 创建条件
     *
     * @param eClass 条件所属表
     * @param isOr   是否为 Or 条件
     * @param column 表字段
     * @param kwd    条件关键字
     * @param val    条件值
     * @param <E>    表类型
     * @return 条件对象
     * @throws IllegalArgumentException 异常信息
     */
    public <E, T> Condition create(Class<T> eClass, boolean isOr, SFunc<E, ?> column, SQLKeywords kwd, Object val) throws IllegalArgumentException;
    
    /**
     * 创建条件
     *
     * @param rawType    表类型
     * @param isOr       是否为 Or 条件
     * @param column     表字段
     * @param opt        操作符
     * @param expression 表达式
     * @param param      参数
     * @param <E>
     * @return
     * @throws IllegalArgumentException
     */
    public <E> Condition createExpression(Class<E> rawType, boolean isOr, String column, Ops opt, String expression, Object param) throws IllegalArgumentException;
    
    public <E, T> Condition createExpression(Class<T> rawType, boolean isOr, SFunc<E, ?> column, Ops opt, String expression, Object param) throws IllegalArgumentException;
}
